package com.systop.common.modules.dept.service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.hibernate.criterion.MatchMode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import com.systop.common.modules.dept.model.Dept;
import com.systop.common.modules.security.user.model.User;
import com.systop.common.modules.security.user.service.UserManager;
import com.systop.core.Constants;
import com.systop.core.service.BaseGenericsManager;

/**
 * 部门管理Manager
 * 
 * @author Sam Lee
 */
@Service
public class DeptManager extends BaseGenericsManager<Dept> {

	@Autowired
	private UserManager userManager;

	// 用于计算部门编号
	private DeptSerialNoManager serialNoManager;

	@Autowired(required = true)
	public void setSerialNoManager(DeptSerialNoManager serialNoManager) {
		this.serialNoManager = serialNoManager;
	}

	/**
	 * 保存部门信息
	 * 
	 * @see BaseGenericsManager#save(java.lang.Object)
	 */
	@Override
	@Transactional
	public void save(Dept dept) {
		Assert.notNull(dept);
		// Dept parent = dept.getParent();
		// getDao().evict(parent);
		// if (parent != null && parent.getId() != null) {
		// parent = get(parent.getId());
		// }
		// dept.setParent(parent);
		if (dept.getId() == null) {// 新建的部门设置部门编号
			dept.setSerialNo(serialNoManager.getSerialNo(dept));
		}
		// getDao().getHibernateTemplate().clear();
		super.save(dept);
	}

	/**
	 * 删除部门，解除关联关系
	 */

	@SuppressWarnings("unchecked")
	@Override
	@Transactional
	public void remove(Dept dept) {
		Assert.notNull(dept);
		/**
		 * 部门隐藏，与角色关系不存在 //解除部门-角色关联 dept.setRoles(Collections.EMPTY_SET);
		 */
		// 解除父部门关联
		dept.setParent(null);
		// 解除子部门关联
		Set<Dept> children = dept.getChildDepts();
		for (Dept child : children) {
			child.setParent(null);
		}
		dept.setChildDepts(Collections.EMPTY_SET);

		super.remove(dept);
	}

	/**
	 * 根据部门名称得到部门对应的实体
	 * 
	 * @return
	 */
	public Dept getDeptByName(String name) {
		String hql = "from Dept d where d.name = ? ";
		Dept dept = (Dept) getDao().findObject(hql, name);
		return dept;
	}

	/**
	 * 根据parentId获得子部门
	 * 
	 * @param parentId
	 * @return
	 */
	public List<Dept> getDeptsByParentId(Integer parentId) {
		List<Dept> depts = null;
		String hql = null;
		if (parentId == null) {
			hql = "from Dept d where d.parent is null order by serialNo";
			depts = query(hql);
		} else {
			hql = "from Dept d where d.parent.id = ? order by serialNo";
			depts = query(hql, parentId);
		}
		return depts;
	}

	/**
	 * 根据部门编号得到部门对应的实体
	 * 
	 * @return
	 */
	public Dept getDeptBySerialNo(String serialNo) {
		String hql = "from Dept d where d.serialNo = ? ";
		Dept dept = (Dept) getDao().findObject(hql, serialNo);
		return dept;
	}

	/**
	 * 根据部门编号，获得本部门以及下属的所有部门
	 * @param dept
	 * @return
	 */
	public List<Dept> getDeptsBySerNo(String deptSerialNo) {
		List<Dept> depts = new ArrayList<Dept>();
		if (StringUtils.isNotBlank(deptSerialNo)&& deptSerialNo.length() > 1) {
			String hql = "from Dept d where d.serialNo like ? order by d.serialNo";
			depts = query(hql, MatchMode.START.toMatchString(deptSerialNo));
		}
		return depts;
	}
	
	/**
	 * 根据部门编号，层层获得部门【01,02,01,03】
	 * 
	 * @param dept
	 * @return
	 */
	public List<Dept> getDeptsBySerialNo(String deptSerialNo) {
		List<Dept> depts = new ArrayList<Dept>();
		if (deptSerialNo != null && deptSerialNo.length() > 1) {
			Integer serialNoSize = deptSerialNo.split(",").length;
			List<String> serialNos = new ArrayList<String>();
			for (int i = 0; i < serialNoSize; i++) {
				String deptNo = deptSerialNo.substring(0,
						((serialNoSize - i) * 3 - 1));
				serialNos.add(deptNo);
			}
			for (String serNo : serialNos) {// 循环查询部门
				depts.add(getDeptBySerialNo(serNo));
			}
		}
		return depts;
	}

	/**
	 * 判断各级部门是否都有负责人
	 * 
	 * @param depts
	 * @return
	 */
	public String checkManagerUser(List<Dept> depts) {
		String deptNames = StringUtils.EMPTY;
		for (Dept dept : depts) {
			List<User> mgrs = userManager.getDeptManagers(dept.getId());
			if (mgrs.isEmpty()) {
				deptNames = deptNames + dept.getName() + ",";
			}
		}
		return deptNames;
	}

	/**
	 * 判断各级部门是否都有负责人
	 * 
	 * @param depts
	 * @return
	 */
	public String checkManagerUser(String deptSerialNo) {
		return checkManagerUser(getDeptsBySerialNo(deptSerialNo));
	}
	
	/**
	 * 获得末端部门
	 * @return
	 */
	public List<Dept> getIsLeafDepts(){
		String hql = "from Dept d where d.isLeaf = ? order by d.serialNo";
		return query(hql, Constants.YES);
	}

	/**
	 * 根据部门Id获取部门负责人
	 * 
	 * @see com.systop.common.modules.security.user.service.UserManager.
	 *      getDeptManagers(Integer deptid)
	 */
	public List<User> getManagers(Integer deptid) {
		return userManager.getDeptManagers(deptid);
	}

	/**
	 * 根据部门ID获取其部门下所有的部门负责人ids及names
	 * 
	 * @see com.systop.common.modules.security.user.service.UserManager.
	 *      getDeptManagersMap(Integer deptid)
	 */
	public Map<String, String> getManagersMap(Integer deptid) {
		return userManager.getDeptManagersMap(deptid);
	}
}
